#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>


int main()
{
  if(!fork())
  {
    //child
    printf("I am a child process\n");
   // execl("/usr/bin/ls","ls","-a","-l",NULL);
    //  char* argv[] = {
    //   "ls",
    //   "-a",
    //   "-l",
    //   "-n",
    //   NULL
    // };
    // execv("/usr/bin/ls",argv);
    //execlp("ls","ls","-a","-l",NULL);
    //  char* argv[] = {
    //   "ls",
    //   "-l",
    //   "-n",
    //   NULL
    // };
    // execvp("ls",argv);
    //execl("./myexe","myexe",NULL);
    //我们就传一个环境变量
    // char* env[] = {
    //   "MYENV1=hahah",
    //   "MYENV2=hhhhh",
    //   "MYENV3=aaaaa",
    //   "MYENV4=llll",
    //   NULL
    // };
    // char* argv[] = {
    //   "myexe",
    //   NULL
    // }; 
    // execve("./myexe",argv,env);
    //execle("./myexe","myexe",NULL,env);
    execlp("python3","python","test.py",NULL);
    exit(0);
  }
  waitpid(-1,NULL,0);
  printf("wait child success\n");
  return 0;
}




// int main()
// {
//   pid_t id = fork();
//   if(!id)
//   {
//     printf("I am child, pid:%d\n",getpid());
//     //现在我想进行程序替换
//     execl("/usr/bin/lss","ls","-a","-l",NULL); //执行usr的bin目录下的ls命令，系统命令也是一个程序
//     exit(10);
//     printf("hahhahahhahahhaha\n");
//     printf("hahhahahhahahhaha\n");
//     printf("hahhahahhahahhaha\n");
//     printf("hahhahahhahahhaha\n");
//     printf("hahhahahhahahhaha\n");
//     printf("hahhahahhahahhaha\n");

//   }
//   while(1)
//   {
//     printf("I am a father process\n");
//     sleep(1);
//   }
//   waitpid(id,NULL,0);
//   printf("wait success\n");


//   return 0;
// }




































/*
int main()
{
  printf("child process  pid:%d  ppid:%d\n",getpid(),getppid());
  return 0;
}*/




/*
int main()
{
  pid_t id = fork();
  if(!id)
  {
    //child
    int cnt = 3;
    while(cnt)
    {
      printf("child[%d] is running：cnt is : %d\n",getpid(),cnt);

      cnt--;
      sleep(1);
    }
    //子进程运行完就结束不去执行父进程代码
    exit(10);
  }


  int status = 0;
  while(1){
  pid_t ret = waitpid(id,&status,WNOHANG);
  if(!ret)
  {
    //检测子进程没有退出,但是waitpid等待是成功的，需要父进程重复进行等待
    //子进程没有退出，让父进程自己做点自己的事
    printf("Do father things\n");
    
  }
  else if(ret>0)
  {
    //子进程退出了，waitpid也成功了，获取到了对应的结果
    printf("father wait: %d success  status exit code: %d;status exit signal: %d\n",ret,(status>>8)&0xff,status&0x7f);//等待成功的时候结果是会放在status之中的
   //信息出来后就不需要死循环等了，退出就行
   break;
  }
  else{
    //ret<0  等待失败
    printf("waitpid failed\n");
    break;  
  }
  sleep(1);
}*/
/*  //parent
 // sleep(10);//前5秒子进程运行完后，后5秒子进程僵尸进程
  //父进程直接到这里不等待的话就会直接退出了，然后子进程就会被bash领养变成孤儿进程
  printf("father wait begin\n");//父进程等待开始
  int status = 0;
  pid_t ret = waitpid(id,&status,0);   //等待指定一个进程
 // pid_t ret = waitpid(-1,NULL,0);     //等待任意一个子进程,等价于wait
  if(ret > 0)
  {
    if(WIFEXITED(status))//没有收到任何退出信号的
    {
      //正常结束的，获取对应的退出码
      printf("exit code:%d\n",WEXITSTATUS(status));
    }
    else{
      printf("error,get a signal!\n");
    }
   // printf("father wait: %d success  status exit code: %d;status exit signal: %d\n",ret,(status>>8)&0xff,status&0x7f);//等待成功的时候结果是会放在status之中的
  }
  else{
    printf("father wait failed!\n");
  }
  sleep(5);//父进程回收完子进程后再等10s退出  */
//}
























































/*int main()
{
 // *for(int i = 0;i<140;++i)
  {
    printf("%d:  %s\n",i,strerror(i));
  }*/
 // printf("Hello zzy!\n");
 // sleep(2);
  //return 0;
 // exit(12);
  //_exit(12);
//}*/
